package com.example.qimo.conf;

import com.example.qimo.dao.Permission;
import com.example.qimo.dao.Role;
import com.example.qimo.dao.User;
import com.example.qimo.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

//分装权限 角色逻辑
//认证逻辑
//Realm可以是多个
public class MyShiroRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    //授权逻辑，返回AuthorizationInfo对象（包含了当前用户的角色和权限信息）
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = (User) principalCollection.getPrimaryPrincipal();
       //查找登录用户角色
        List<Role> roles = userService.findRoleByUserRole(user.getRole());
        for (Role role : roles) {
            info.addRole(role.getRoleName());
            List<Permission> permissions = userService.findPermissionByRoleId(role.getId());
            for (Permission permission : permissions) {
                info.addStringPermission(permission.getPermitName());
            }
        }
        return info;
    }
    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        System.out.println(token.getUsername());
        User user = userService.getByName(token.getUsername());
        if (user == null) {
            throw  new UnknownAccountException();
        }
        if (user.getStatus().equals("lock")) {
            throw  new LockedAccountException();
        }
        if (user.getStatus().equals("disable")) {
            throw  new DisabledAccountException();
        }
        /**
         * 这是返回身份验证信息的代码。SimpleAuthenticationInfo 是 Shiro 框架中的一个实现类，用于封装用户的身份验证信息
         * 参数1  user 参数表示身份验证的主体对象，可以是任何表示用户身份的实体对象
         * 参数2  表示用户的密码，用于进行密码验证
         * 参数3  返回当前 Realm 的名称，用于标识身份验证信息来源,Realm 可以通过其名称进行唯一标识，以便在 Shiro 配置文件中区分和配置不同的 Realm
         */
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
        //可以用以下方式添加盐值（随机数），添加第3个参数。
        //
        //return new SimpleAuthenticationInfo(user,user.getPassword(),ByteSource.Util.bytes(user.getSalt()),getName());
    }
}